package chwgigs;

public class J17_OOP3 {

	// this 연산자, this() 생성자
	// 멤버변수에 사용하는 this는 현재 클래스 자신을 의미
	// 생성자에 사용하는 this 는 코드 간결성을 위해 사용

	public static void main(String[] args) {
		// 생성자를 이용해 객체를 만들고 멤버변수에 값을 직접 초기화

		Member user01 = new Member();
		user01.userid = "hee1";
		user01.passwd = "123456";

		user01.showInfo();

		// 기본생성자만을 이용해서 멤버변수 초기화
		Member user02 = new Member();
		user02.showInfo();
		Member user03 = new Member();
		user03.showInfo();

		// 인자있는 생성자로 객체 생성
		Member user04 = new Member("skyinline", "456789");
		user04.showInfo();

		Car mycar01 = new Car();

	} // main

} // class

class Member {
	String userid;
	String passwd;

	// 기본 생성자 - 인자 없음 (인자 있는 생성자를 만들면
	// 반드시 기본 생성자를 만든후 에 만들어야 한다.
	public Member() {
		userid = "hee";
		passwd = "987654";
	}

	// 사용자 정의 생성자 - 인자 있음
	public Member(String myuserid, String mypasswd) {
		userid = myuserid;
		passwd = mypasswd;
	}

	// 회원정보 출력 showInfo
	void showInfo() {
		System.out.println(userid);
		System.out.println(passwd);
	}

}//

class Car {
	String brand = null;
	String color = null;

	public Car() {}// 생성자

	// 인자 있는 생성자를 사용하는 경우 기본 생성자도 직접 만들어 둬야 함
	public Car(String mybrand, String mycolor) {
		brand = mybrand;
		color = mycolor;

	}

}//

class DVD {
	int dvdno = 0;
	String dvdtitle = null;
	String genre = null;

	public DVD() {}

	public DVD(int dvdno, String dvdtitle, String genre) {
		// 생성자의 인자명과 멤버변수명은 동일하게 작성
		// - 생성자의 인자명을 새로 짓는것은 귀찮음

		// 그런데, 생성자의 '인자명'과 '멤버변수명'이 서로 같은 경우
		// 멤버변수가리기(shadowing) 현상이 발생
		// 따라서, 클래스의 멤버변수는 this 연산자를 이용해서 가리기 현상을 방지
		// dvdno = dvdno;
		this.dvdno = dvdno;
		this.dvdtitle = dvdtitle;
		this.genre = genre;
	}

}//

class Book {
	int bookno = 0;
	String booktitle = null;
	String genre = null; //

	public Book() {}

	public Book(int bookno) {
		this.bookno = bookno;
	}

	public Book(String booktitle) {
		this.booktitle = booktitle;
	}

	// 생성자를 이용해서 앞에 것보다 좀 더 효율적으로 작성
	public Book(int bookno, String booktitle) {
		this.bookno = bookno;
		this.booktitle = booktitle;
		// Book( bookno ); // 첫번째 줄 코드를 간단히 쓰기
		// Book( booktitle ); // 두번째 줄 코드를 간단히 쓰기
		// this( bookno ); // 첫번째 줄 코드를 this() 대체
		// this( booktitle ); // 두번째 줄 코드를 this() 대체
		// 단, this() 는 언제나 코드의 맨 처음에 나와야 함
	}

}//